<?php
/*

*/

  /* ============================
    Liste des variables attendues
   ------------------------------
    POST ACTION_ITEM         = ADD|ADD_LIEN|ADD_TAG|DEL_TAG|INV_TAG|UP_NOM|MOD_DROITS|PUBLIC|DEL
    POST ID_ITEM[]           = int[]
    POST NOM_ITEM[]          = string[]
    POST NEW_NOM_ITEM[]      = string[]
    POST DROITS_ITEM[]       = liste(droits)[]
    POST TAGS_ITEM[]         = liste(tag)[]
    POST TAGS[]              = liste(tag)[]
    POST FICHIER[]           = file[]
    POST FICHIERL[]          = string[]
    POST LOGIN_DROITS_ITEM[] = liste(login)[]
   =========================== */

  /*
   Actions possibles
   - ajouter des items locaux => FICHIER[],TAGS_ITEM[]
   - ajouter des items distant => FICHIERL[],FICHIERL[],TAGS_ITEM[]
   - renommer des items => ID_ITEM[],NEW_NOM_ITEM[]
   - supprimer des items => ID_ITEM[]
   - ajouter des tags sur des items => ID_ITEM[],TAGS[][]
   - supprimer des tags sur des items => ID_ITEM[],TAGS[][]
   - changer l'état des tags sur des items => ID_ITEM[],TAGS[][]
   - changer les droits sur des items => ID_ITEM[],DROITS_ITEM[][],LOGIN_DROITS_ITEM[][]
   */

$action     = (!empty($_POST['ACTION_ITEM']))       ? cleanVar($_POST['ACTION_ITEM'])       : null;
$id         = (!empty($_POST['ID_ITEM']))           ? cleanVar($_POST['ID_ITEM'],true)      : null;
$nomItem    = (!empty($_POST['NOM_ITEM']))          ? cleanVar($_POST['NOM_ITEM'])          : null;
$newNomItem = (!empty($_POST['NEW_NOM_ITEM']))      ? cleanVar($_POST['NEW_NOM_ITEM'])      : null;
$lesTags    = (!empty($_POST['TAGS']))              ? cleanVar($_POST['TAGS'])              : null;
$tagsItem   = (!empty($_POST['TAGS_ITEM']))         ? cleanVar($_POST['TAGS_ITEM'])         : null;
$fichier    = (!empty($_FILES['FICHIER']))          ? $_FILES['FICHIER']                    : null;
$fichierL   = (!empty($_POST['FICHIERL']))          ? cleanVar($_POST['FICHIERL'])          : null;
$lesLogins  = (!empty($_POST['LOGIN_DROITS_ITEM'])) ? cleanVar($_POST['LOGIN_DROITS_ITEM']) : null;
$valDroits  = (!empty($_POST['DROITS_ITEM']))       ? cleanVar($_POST['DROITS_ITEM'])  : null;
$lienItem   = $proprietaireItem = $droitsItem = null;
$nbrAction  = 0;
$ajout      = false;
$ok         = true;
$admin      = (bool)$_SESSION['IS_ADMIN'];
$tabErr     = array();

try
{
  // DROITS: si il est identifié
  if(!isset($_SESSION['IDENTIFICATION_OK']))
    {
      throw new ListerException(201);
    }

  $nbItem = max(count($id), count($fichierL), count(cleanVar($fichier['name'])));

  // On teste si les données en entrées permettent l'action demandée
  $p = (is_null($id) || count($id) < $nbItem);
  $t = (is_null($lesTags) || count($lesTags) < $nbItem);
  if(
     is_null($action) 
     || ($action == 'ADD'        && (empty($fichier))) 
     || ($action == 'ADD_LIEN'   && (is_null($fichierL))) 
     || ($action == 'ADD_TAG'    && ($t)) 
     || ($action == 'DEL_TAG'    && ($t))
     || ($action == 'INV_TAG'    && ($t))
     || ($action == 'PUBLIC'     && (is_null($valDroits)))
     || ($action == 'UP_NOM'     && (is_null($newNomItem) || count($newNomItem) < $nbItem || $p)) 
     || ($action == 'MOD_DROITS' && (is_null($valDroits)  || count($valDroits)  < $nbItem || 
				     is_null($lesLogins)  || count($lesLogins)  < $nbItem )) 
     || ($action == 'DEL'        && ($p))
     )
    {
      throw new ListerException(15,'','marqueur 1');
    }
  //--- bug pas la bonne erreur si action=ADD et que d'autres champs sont renseignés

  $cpt = 0;
  for($cpt = 0 ; $cpt < $nbItem ; $cpt++)
    {
      if(!is_null($fichier) && !empty($fichier['name'][$cpt]))
	{
	  $fichieri['name']     = $fichier['name'][$cpt];
	  $fichieri['type']     = $fichier['type'][$cpt];
	  $fichieri['tmp_name'] = $fichier['tmp_name'][$cpt];
	  $fichieri['error']    = $fichier['error'][$cpt];
	  $fichieri['size']     = $fichier['size'][$cpt];
	}
      $idi = $nomItemi = $newNomItemi = $tagsItemi = $lesTagsi = $fichierLi = $lesLoginsi = $valDroitsi = null;
      if(!is_null($id))        { list(, $idi)         = each($id);        }
      if(!is_null($nomItem))   { list(, $nomItemi)    = each($nomItem);   }
      if(!is_null($newNomItem)){ list(, $newNomItemi) = each($newNomItem);}
      if(!is_null($tagsItem))  { list(, $tagsItemi)   = each($tagsItem);  }
      if(!is_null($lesTags))   { list(, $lesTagsi)    = each($lesTags);   }
      // if(!is_null($fichier)){ list(, $fichieri)    = each($fichier);   }
      if(!is_null($fichierL))  { list(, $fichierLi)   = each($fichierL);  }
      if(!is_null($lesLogins)) { list(, $lesLoginsi)  = each($lesLogins); }
      if(!is_null($valDroits)) { list(, $valDroitsi)  = each($valDroits); }

      $tabErr['ERR'] = '';

      // ajouter un item local
      if($action == 'ADD')
	{
	  // DROITS: ajouter un item: si il a le droits d'uploader
	  if($_SESSION['IS_UPLOADER'] === false && !$admin)
	    {
	      //throw new ListerException(203);
	      $tabErr['ERR'] = 203; 
	    }
	  else
	    {  
	      $idi = 0;
	      
	      $nomItemi = is_null($nomItemi) ?  trNomFichier($fichieri['name']): $nomItemi;
	      $lienItem = $CONF['upload_dir'].trNomFichierUp($fichieri['name']);

              // on traite les fichiers php a part pour des raisons de sécurité
              if(eregi('\.(php.?|phtml)$', $fichieri['name']))
                {
                  $lienItem = preg_replace('`\.'.trouveExtention($lienItem).'$`i','.phps',$lienItem);
                }   
              
              if(!@move_uploaded_file($fichieri['tmp_name'], $lienItem))
                {
                  //throw new ListerException(140+((int)$fichieri['error']));
		  $tabErr['ERR'] = 140+((int)$fichieri['error']);
		}
	      else
		{
		  $ajout = true;
		  $proprietaireItem = $_SESSION['LOGIN'];
		  $droitsItem = 2;
		}
		

		
	    }
	}
      
      // ajouter un item distant
      if($action == 'ADD_LIEN')
	{
	  // DROITS: ajouter un item: si il a le droits d'uploader
	  if($_SESSION['IS_UPLOADER'] === false && !$admin)
	    {
	      //throw new ListerException(203);
	      $tabErr['ERR'] = 203; 
	    }
	  else
	    {
	      $idi = 0;
	      
	      $nomItemi = is_null($nomItemi) ? trNomFichier($fichierLi) : $nomItemi;
	      $lienItem = $CONF['upload_dir'].trNomFichierUp($fichierLi);
	      
	      
	      if(!file_exists_url($fichierLi))
		{
		  //throw new ListerException(404);
		  $tabErr['ERR'] = 404; 
		}
	      else
		{ 
		  $lienItem = $fichierLi;
		  $ajout = true;
		  $proprietaireItem = $_SESSION['LOGIN'];
		  $droitsItem = 2;
		}
	    }
	}
      
      $aTags = $tagsItemi;
      if(!is_array($aTags))
	$aTags = (!empty($tagsItemi)) ? explode(',', $tagsItemi) : null;
	try{
      $item = new Item($idi, $nomItemi, $lienItem, $proprietaireItem, $droitsItem, $aTags);
      }
      catch(ListerException $e){
	      $tabErr['ERR'] = $e->getNum(); 
	      $action = null;
      }

      // ajouter item
      if(($action == 'ADD' || $action == 'ADD_LIEN') && $ajout)
	{
	  try
	    {
	      $item->enregistrer();
	      if(!is_null($valDroitsi) && !is_array($valDroitsi))
		{
		  $item->changerPublic(($valDroitsi==1));
		}
	      else if(is_array($valDroitsi))
		{
		  $tabLogins    = explode(',', $valDroitsi['logins']);
		  $tabValDroits = explode(',', $valDroitsi['droits']);
		  if(count($tabLogins) != count($tabValDroits))
		    {
		      throw new ListerException(15,'','marqueur 2');
		    }
		  
		  foreach($tabLogins as $l)	 
		    {
		      list(, $d) = each($tabValDroits);
		      $item->changerDroits($d, $l);
		    }
		}
	      $nbrAction++;
	    }
	  catch(ListerException $e)
	    {
	      $tabErr['ERR'] = $e->getNum();; 
	    }
	}
      
      // ajouter un tag
      if($action == 'ADD_TAG')
	{
	  // DROITS: ajouter un tag sur un item: si il a les droits sur cet item
	  if(!$admin && $item->getDroits() <= 1)
	    {
	      //throw new ListerException(208, $item->getIdItem());
	      $tabErr['ERR'] = 208; 
	    }
	  else
	    {
	      $tabTags = explode(',', $lesTagsi);
	      try
		{
		  
		  foreach($tabTags as $t)
		    $item->ajouterTag($t);
		  $nbrAction++;
		}
	      catch(ListerException $e)
		{
		  $tabErr['ERR'] = $e->getNum();; 
		}

	    }
	}
      
      // supprimer un tag
      if($action == 'DEL_TAG')
	{
	  // DROITS: supprimer un tag d'un item: si il a les droits sur cet item
	  if(!$admin && $item->getDroits() <= 1)
	    {
	      //throw new ListerException(209, $item->getIdItem());
	      $tabErr['ERR'] = 209; 
	    }
	  else
	    {
	      
	      $tabTags = explode(',', $lesTagsi);
	      try
		{
		  foreach($tabTags as $t)
		    $item->retirerTag($t);
		  $nbrAction++;
		}
	      catch(ListerException $e)
		{
		  $tabErr['ERR'] = $e->getNum();; 
		}
	      
	    }
	}
      
      // changer l'etat d'un tag
      if($action == 'INV_TAG')
	{
	  // DROITS: changer l'etat d'un tag d'un item: si il a les droits sur cet item
	  if(!$admin && $item->getDroits() <= 1)
	    {
	      //throw new ListerException(209, $item->getIdItem());
	      $tabErr['ERR'] = 209; 
	      
	    }
	  else
	    {	
	      $tabTags = explode(',', $lesTagsi);
	      try
		{
		  foreach($tabTags as $t)
		    $item->invTag($t);
		  $nbrAction++;
		}
	      catch(ListerException $e)
		{
		  $tabErr['ERR'] = $e->getNum();; 
		}
	      
	    }
	}
      
      // renommer un item
      if($action == 'UP_NOM')
	{
	  // DROITS: renommer un item: si il a les droits sur cet item
	  if(!$admin && $item->getDroits() <= 1)
	    {
	      //throw new ListerException(210, $item->getIdItem());
	      $tabErr['ERR'] = 210; 
	    }
	  else
	    {
	      try
		{
		  $item->renommer($newNomItemi);
		  $nbrAction++;
		}
	      catch(ListerException $e)
		{
		  $tabErr['ERR'] = $e->getNum();; 
		}

	    }
	}
      
      // changer les droits
      if($action == 'MOD_DROITS')
	{
	  // DROITS: changer les droit de l'item: si il est proprietaire de cet item
	  if(!$admin && !$item->isProprietaire($_SESSION['LOGIN']))
	    {
	      //throw new ListerException(211, $item->getIdItem());
	      $tabErr['ERR'] = 211; 
	    }
	  else
	    {
	      $tabLogins    = explode(',', $lesLoginsi);
	      $tabValDroits = explode(',', $valDroitsi);
	      if(count($tabLogins) != count($tabValDroits))
		{
		  throw new ListerException(15,'','marqueur 2');
		}
	      
	      try
		{
		  foreach($tabLogins as $l)	 
		    {
		      list(, $d) = each($tabValDroits);
		      $item->changerDroits($d, $l);
		    }
		  $nbrAction++;
		}
	      catch(ListerException $e)
		{
		  $tabErr['ERR'] = $e->getNum();; 
		}
	      
	    }
	}

      // rendre public/privé
      if($action == 'PUBLIC')
	{
	  // DROITS: changer les droit de l'item: si il est proprietaire de cet item
	  if(!$admin && !$item->isProprietaire($_SESSION['LOGIN']))
	    {
	      //throw new ListerException(211, $item->getIdItem());
	      $tabErr['ERR'] = 211; 
	    }
	  else
	    {
	      try
		{
		  $item->changerPublic(($valDroitsi==1));
		  $nbrAction++;
		}
	      catch(ListerException $e)
		{
		  $tabErr['ERR'] = $e->getNum();; 
		}
	      
	    }
	}
      
      // supprimer item
      if($action == 'DEL')
	{
	  // DROITS: supprimer un item: si il a les droits sur cet item
	  if(!$admin && $item->getDroits() <=1)
	    {
	      //throw new ListerException(212, $item->getIdItem());
	      $tabErr['ERR'] = 212; 		  
	    }
	  else
	    {
	      try
		{
		  $item->supprimer();
		  $nbrAction++;
		}
	      catch(ListerException $e)
		{
		  $tabErr['ERR'] = $e->getNum();; 
		}
	      
	    }
	}

// verification d'erreur sur l'item courant
      if(empty($tabErr['ERR'])){
        $tabErr['OK'] = 'ok';
        $tabErr['MESSAGE_ERR'] = '';
      }
      else{
        $ok = false;
        $tabErr['OK'] = 'err';
        global $err;
        $tabErr['MESSAGE_ERR'] = $err[$tabErr['ERR']];
      }

      // block var
      if(!is_null($action)) $template->assign_block_vars('item', array_merge($item->returnArray(), $tabErr));      
      else $template->assign_block_vars('item', $tabErr);      
      
    }
  
  if($nbrAction == 0) throw new ListerException(15,'','marqueur 3');
  
  //$ok = true;
  $template->assign_vars(array('OK' => (($ok)?'ok':'err')));
  $template->assign_vars(array('NOMBRE_ACTION' => $nbrAction));
}
catch(ListerException $e)
{
  $template->assign_vars($e->returnArray());
  $template->assign_vars(array('OK'  => 'err'));
}

?>
